/* 
https://vue3js.cn/interview/JavaScript/event_loop.html#%E4%B8%89%E3%80%81async%E4%B8%8Eawait
*/

// 输出过程由：主线程立即执行→异步微任务→异步宏任务；

/* 
  不管await后面跟着的是什么，await都会阻塞(不阻塞自己)后面的代码(加入微任务队列)；
  先执行async外部的同步代码，之后回到async函数中执行阻塞的代码；
*/

/* 分析下面输出 */
async function async1() {
  console.log("async1 start"); // 直接执行 2
  await async2();  // 执行async2 ，阻塞后面代码，跳出async执行同步
  console.log("async1 end"); // 阻塞:异步微任务1
}
async function async2() {
  console.log("async2");  // 直接执行 3
}
console.log("script start"); // 主线程直接执行 1

setTimeout(function () {
  console.log("settimeout"); // 异步宏任务1
});

async1(); 

new Promise(function (resolve) {
  console.log("promise1"); // 直接执行 4
  resolve();
}).then(function () {
  console.log("promise2"); // 异步微任务2
});
console.log("script end"); // 直接执行 5

/* 
由上分析可得输出为：直接执行→异步微任务(所有的微任务队列完成)→异步宏任务(多个宏任务完成一个就去执行所有微任务再去执行下一个宏任务)
script start
async1 start
async2
promise1
script end
async1 end
promise2
settimeout
*/
